5601{
5602
5605
5606
5610
5612
5613 sScriptMgr->OnSpellCheckCast(
this, strict, res);
5614
5616 return res;
5617
5618
5620 {
5622 {
5623
5626
5628 {
5631 else
5633 }
5634
5635
5638 }
5641 }
5642
5644 {
5647 }
5648
5649
5652
5653
5658
5660 {
5664
5668 }
5669
5670
5671
5673 {
5674 bool checkForm = true;
5675
5677 for (Unit::AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
5678 {
5680 continue;
5681 checkForm = false;
5682 break;
5683 }
5684 if (checkForm)
5685 {
5686
5689 return shapeError;
5690
5693 }
5694 }
5695
5697 for (Unit::AuraEffectList::const_iterator blockItr = blockSpells.begin(); blockItr != blockSpells.end(); ++blockItr)
5700
5701 bool reqCombat = true;
5703 for (Unit::AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
5704 {
5706 {
5708 if ((*j)->GetMiscValue() == 1)
5709 {
5710 reqCombat = false;
5711 break;
5712 }
5713 }
5714 }
5715
5716
5717
5719 {
5724
5725
5730
5733 }
5734
5735
5737 {
5740 if (instanceScript->IsEncounterInProgress())
5741 {
5743 for (
GroupReference* itr = group->GetFirstMember(); itr !=
nullptr; itr = itr->
next())
5744 if (
Player* member = itr->GetSource())
5748 {
5751 break;
5752 }
5754 }
5755 }
5756
5757
5758
5760 {
5761
5765 }
5766
5769 {
5772 {
5775 {
5777 if (shapeShiftEntry && (shapeShiftEntry->
flags1 & 1) == 0)
5779 break;
5780 }
5781 }
5782
5785
5786 if (!checkMask)
5788
5789
5794 }
5795
5796
5797 {
5801 if (!conditions.empty() && !
sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
5802 {
5803
5805 {
5809 }
5813 }
5814 }
5815
5816
5817
5818
5819
5820
5822 {
5823
5824
5826 {
5829 return castResult;
5830 }
5831 }
5832
5834 {
5837 return castResult;
5838
5840 {
5841
5844
5845
5848
5851 {
5852 bool castedByGameobject = false;
5855 {
5857 }
5859 {
5861 {
5862 castedByGameobject = tempSummon->GetSummonerGameObject() != nullptr;
5863 }
5864 }
5865
5866 if (castedByGameobject)
5867 {
5868
5869 losChecks &= ~LINEOFSIGHT_CHECK_GOBJECT_M2;
5870 }
5871
5873 {
5875 }
5876 }
5877 }
5878 }
5879
5880
5882 {
5883 float x, y, z;
5885
5888 {
5889 bool castedByGameobject = false;
5892 {
5894 }
5896 {
5898 {
5899 castedByGameobject = tempSummon->GetSummonerGameObject() != nullptr;
5900 }
5901 }
5902
5903 if (castedByGameobject)
5904 {
5905
5906 losChecks &= ~LINEOFSIGHT_CHECK_GOBJECT_M2;
5907 }
5908
5910 {
5912 }
5913 }
5914 }
5915
5916
5918 {
5920 {
5922 {
5925 else
5927 }
5928 break;
5929 }
5930 }
5931
5935
5936
5937
5938
5942 if (mapEntry->IsBattleArena())
5944
5945
5947 {
5950
5954 return locRes;
5955 }
5956
5957
5960 {
5963 else
5965 }
5966
5968
5969
5971 {
5972
5975 return castResult;
5976
5979 return castResult;
5980 }
5981
5982
5983
5986 return castResult;
5987
5989 {
5992 return castResult;
5993 }
5994
5995
5997 {
6000 return castResult;
6001
6002
6004 {
6006 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
6009 }
6010 }
6011
6012
6015 return castResult;
6016
6017 bool hasDispellableAura = false;
6018 bool hasNonDispelEffect = false;
6022 {
6024 {
6025 hasDispellableAura = true;
6026 break;
6027 }
6028
6030 }
6032 {
6033 hasNonDispelEffect = true;
6034 break;
6035 }
6036
6037 if (!hasNonDispelEffect && !hasDispellableAura && dispelMask && !
IsTriggered())
6038 {
6040 {
6041
6043 {
6045 {
6046
6048 if (!player || !player->
duel || target != player->
duel->Opponent)
6050 }
6051 }
6052
6054 target->GetDispellableAuraList(
m_caster, dispelMask, dispelList);
6055 if (dispelList.empty())
6057 }
6058 }
6059
6061 {
6062
6064 {
6066 {
6068 {
6069
6071 {
6073 if (!target)
6075
6078 }
6079 }
6080 break;
6081 }
6083 {
6086
6088 break;
6089
6091
6092 if (!pet)
6094
6096
6097 if (!learn_spellproto)
6099
6102
6103 break;
6104 }
6106 {
6107
6109 {
6112
6116
6118
6119 if (!learn_spellproto)
6121
6124 }
6125 break;
6126 }
6128 {
6133 break;
6134 }
6136 {
6139
6141 if (!foodItem)
6143
6145
6146 if (!pet)
6148
6151
6154
6157
6158 break;
6159 }
6162 {
6163
6168 break;
6169 }
6171 {
6173 {
6175 }
6176
6178 {
6179
6182 }
6184 {
6185
6187 {
6189 }
6190 }
6195
6196
6198 {
6200 if (!target)
6202
6203
6206
6209
6212
6213
6221
6223 }
6226 break;
6227 }
6229 {
6232
6235
6239
6241
6244 int32 ReqValue = (skillValue < 100 ? (TargetLevel - 10) * 10 : TargetLevel * 5);
6245 if (ReqValue > skillValue)
6247
6248 break;
6249 }
6251 {
6254 break;
6255
6257
6260
6261 Item* pTempItem =
nullptr;
6263 {
6266 }
6269
6270
6275
6276
6278 {
6280 {
6282 }
6283 }
6286 {
6288 {
6291 }
6295 }
6296
6297
6300 {
6301 lockId = go->GetGOInfo()->GetLockId();
6302 if (!lockId)
6304 }
6306 lockId = itm->GetTemplate()->LockID;
6307
6309 int32 reqSkillValue = 0;
6310 int32 skillValue = 0;
6311
6312
6315 return res;
6316
6317
6318
6320 {
6321
6323 {
6325 }
6326 }
6327 break;
6328 }
6330 {
6332 if (!unitCaster)
6333 {
6335 }
6336
6338 if (pet)
6339 {
6341 {
6343 }
6344 }
6346 {
6347 PetStable& petStable = playerCaster->GetOrInitPetStable();
6349 {
6351 }
6352 }
6353
6354 break;
6355 }
6356
6358 {
6361 break;
6362 switch (SummonProperties->
Category)
6363 {
6367 [[fallthrough]];
6371 break;
6372 }
6373 break;
6374 }
6376 {
6378 {
6383 }
6384 break;
6385 }
6387 {
6389 if (!unitCaster)
6391
6393 {
6398 }
6399
6403
6406 {
6408 if (info.first)
6409 {
6411 {
6412 if (!info.first->Health)
6413 {
6416 }
6417
6420 {
6421
6422 if (creatureInfo && creatureInfo->
IsTameable(
true))
6424 else
6426
6428 }
6429 }
6430 }
6432 {
6435 }
6436 }
6437 break;
6438 }
6440 {
6445
6449
6450
6453
6454
6457 {
6460
6461
6462
6463
6464
6466 if (!instance)
6468 if (!target->
Satisfy(
sObjectMgr->GetAccessRequirement(mapId, difficulty), mapId))
6470 }
6471 break;
6472 }
6473
6475 {
6478
6480
6483
6485
6486 if (!target ||
6489
6490
6493
6494 break;
6495 }
6498 {
6499
6504 break;
6505 }
6507 {
6510
6511 bool found = false;
6513 for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
6514 {
6515 if( itr->second->GetBase()->IsPassive() )
6516 continue;
6517
6518 if( !itr->second->IsPositive() )
6519 continue;
6520
6521 found = true;
6522 break;
6523 }
6524
6525 if( !found )
6527
6528 break;
6529 }
6531 {
6533 {
6536 else
6538 }
6539 break;
6540 }
6541
6544 {
6547 break;
6548 }
6552
6557 break;
6558 default:
6559 break;
6560 }
6561 }
6562
6564 {
6566 {
6568 break;
6570 {
6573
6575 if (!pet)
6577
6580 break;
6581 }
6585 {
6588
6589
6591 {
6594
6597 }
6599 {
6602 }
6603
6605 {
6608
6611
6614
6617
6620
6624 }
6625
6626 break;
6627 }
6629 {
6630
6633
6634
6637 if (it)
6641
6644
6645
6651
6652 break;
6653 }
6655 {
6658
6659
6662
6663 break;
6664 }
6667 {
6668
6671
6672
6673
6675 {
6680 }
6681 break;
6682 }
6684 {
6686 break;
6687
6689 break;
6690
6693
6696
6697 break;
6698 }
6700 {
6702 {
6704 }
6705 break;
6706 }
6708 {
6710 {
6712 }
6713 break;
6714 }
6715 default:
6716 break;
6717 }
6718 }
6719
6720
6722 {
6725
6728
6730
6731 if (!my_trade)
6733
6737
6741 }
6742
6743
6745 {
6747 {
6749 {
6751 }
6752 }
6753 else
6754 {
6756 {
6758 }
6759 }
6760 }
6761
6762
6766
6767
6769}
constexpr auto IN_MILLISECONDS
int32 irand(int32 min, int32 max)
#define SPECTATOR_SPELL_BINDSIGHT
@ CONDITION_SOURCE_TYPE_SPELL
std::list< Condition * > ConditionList
DBCStorage< SpellShapeshiftEntry > sSpellShapeshiftStore(SpellShapeshiftfmt)
DBCStorage< SummonPropertiesEntry > sSummonPropertiesStore(SummonPropertiesfmt)
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ PLAYER_ALLOW_ONLY_ABILITY
@ MOVEMENTFLAG_FALLING_FAR
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
std::list< std::pair< Aura *, uint8 > > DispelChargesList
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_MOD_IGNORE_SHAPESHIFT
@ SPELL_AURA_PERIODIC_MANA_LEECH
@ SPELL_AURA_MOD_POSSESS_PET
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
@ SPELL_AURA_BLOCK_SPELL_FAMILY
@ AURA_INTERRUPT_FLAG_NOT_SEATED
@ AURA_INTERRUPT_FLAG_MOUNT
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
@ TRIGGERED_IGNORE_GCD
Not triggered.
@ TRIGGERED_IGNORE_CASTER_AURAS
Will ignore mounted/on vehicle restrictions.
std::vector< SpellImmune > SpellImmuneList
@ SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
#define SPELL_RELIC_COOLDOWN
@ VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL
@ VEHICLE_SEAT_FLAG_UNCONTROLLED
@ VEHICLE_SEAT_FLAG_CAN_ATTACK
@ SPELL_ATTR7_DEBUG_SPELL
@ SPELL_EFFECT_POWER_BURN
@ SPELL_EFFECT_SUMMON_RAF_FRIEND
@ SPELL_EFFECT_APPLY_GLYPH
@ SPELL_EFFECT_SUMMON_PLAYER
@ SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
@ SPELL_EFFECT_RESURRECT_PET
@ SPELL_EFFECT_POWER_DRAIN
@ SPELL_EFFECT_RESURRECT_NEW
@ SPELL_EFFECT_TALENT_SPEC_SELECT
@ SPELL_EFFECT_LEARN_SPELL
@ SPELL_EFFECT_CREATE_TAMED_PET
@ SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
@ SPELL_EFFECT_LEARN_PET_SPELL
@ SPELL_PREVENTION_TYPE_NONE
@ SPELL_ATTR5_ALWAYS_AOE_LINE_OF_SIGHT
@ TARGET_GAMEOBJECT_TARGET
@ SPELL_ATTR2_IGNORE_LINE_OF_SIGHT
@ SPELL_ATTR1_INITIATE_COMBAT
@ SPELL_ATTR3_ONLY_BATTLEGROUNDS
@ PET_TAME_NOPET_AVAILABLE
@ PET_TAME_CANT_CONTROL_EXOTIC
@ SPELLFAMILY_DEATHKNIGHT
@ SPELL_CUSTOM_ERROR_GM_ONLY
@ SPELL_ATTR0_ONLY_INDOORS
@ SPELL_ATTR0_AURA_IS_DEBUFF
@ SPELL_ATTR0_ONLY_OUTDOORS
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
@ SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD
@ SPELL_ATTR0_ONLY_STEALTHED
@ SPELL_FAILED_TARGET_NOT_LOOTED
@ SPELL_FAILED_NOT_INFRONT
@ SPELL_FAILED_NOT_MOUNTED
@ SPELL_FAILED_AFFECTING_COMBAT
@ SPELL_FAILED_CASTER_AURASTATE
@ SPELL_FAILED_NOTHING_TO_DISPEL
@ SPELL_FAILED_FOOD_LOWLEVEL
@ SPELL_FAILED_TARGET_NOT_DEAD
@ SPELL_FAILED_WRONG_PET_FOOD
@ SPELL_FAILED_CUSTOM_ERROR
@ SPELL_FAILED_SUMMON_PENDING
@ SPELL_FAILED_DAMAGE_IMMUNE
@ SPELL_FAILED_BAD_IMPLICIT_TARGETS
@ SPELL_FAILED_NO_COMBO_POINTS
@ SPELL_FAILED_ALREADY_HAVE_SUMMON
@ SPELL_FAILED_ALREADY_OPEN
@ SPELL_FAILED_NOT_TRADING
@ SPELL_FAILED_NOTHING_TO_STEAL
@ SPELL_FAILED_NO_MOUNTS_ALLOWED
@ SPELL_FAILED_NOT_IN_BATTLEGROUND
@ SPELL_FAILED_NOT_BEHIND
@ SPELL_FAILED_ALREADY_HAVE_CHARM
@ SPELL_FAILED_TARGET_NOT_IN_INSTANCE
@ SPELL_FAILED_ONLY_BATTLEGROUNDS
@ SPELL_FAILED_NOT_IN_ARENA
@ SPELL_FAILED_ITEM_ALREADY_ENCHANTED
@ SPELL_FAILED_ONLY_STEALTHED
@ SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED
@ SPELL_FAILED_ONLY_ABOVEWATER
@ SPELL_FAILED_CANT_BE_CHARMED
@ SPELL_FAILED_CASTER_DEAD
@ SPELL_FAILED_NOT_ON_MOUNTED
@ SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW
@ SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED
@ SPELL_FAILED_TARGET_UNSKINNABLE
@ SPELL_FAILED_NOT_SHAPESHIFT
@ SPELL_FAILED_UNIQUE_GLYPH
@ SPELL_FAILED_ONLY_OUTDOORS
@ SPELL_FAILED_LINE_OF_SIGHT
@ SPELL_FAILED_SPELL_IN_PROGRESS
@ SPELL_FAILED_SPELL_UNAVAILABLE
@ SPELL_FAILED_ONLY_INDOORS
@ SPELL_FAILED_NOT_ON_TAXI
@ SPELL_FAILED_TARGET_FRIENDLY
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
@ SPELL_ATTR4_NOT_IN_ARENA_OR_RATED_BATTLEGROUND
@ SPELL_ATTR6_ALLOW_WHILE_RIDING_VEHICLE
bool IsPathfindingEnabled(const Map *map)
Player * FindPlayer(ObjectGuid const guid)
bool CanFlyIn()
Return if we can use mount in battlefield.
Condition * mLastFailedCondition
WorldObject * mConditionTargets[MAX_CONDITION_TARGETS]
CreatureTemplate const * GetCreatureTemplate() const
bool IsSpellProhibited(SpellSchoolMask idSchoolMask) const
SkillType GetRequiredLootSkill() const
bool IsTameable(bool exotic) const
GameObjectTemplate const * GetGOInfo() const
ItemTemplate const * GetTemplate() const
InstanceScript * GetInstanceScript() const
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }) const
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
float GetVisibilityRange() const
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
uint64 GetRawValue() const
bool IsGameObject() const
void GetPosition(float &x, float &y) const
Player * GetOwner() const
bool HaveInDiet(ItemTemplate const *item) const
uint32 GetCurrentFoodBenefitLevel(uint32 itemlevel) const
static std::pair< PetStable::PetInfo const *, PetSaveMode > GetLoadPetInfo(PetStable const &stable, uint32 petEntry, uint32 petnumber, bool current)
Optional< PetInfo > CurrentPet
std::vector< PetInfo > UnslottedPets
void SetCanTeleport(bool value)
bool IsInSameRaidWith(Player const *p) const
bool CanTameExoticPets() const
bool CanUseBattlegroundObject(GameObject *gameobject) const
bool InBattleground() const
PetStable * GetPetStable()
Battleground * GetBattleground(bool create=false) const
WorldSession * GetSession() const
bool HasSpellCooldown(uint32 spell_id) const override
bool IsGameMaster() const
time_t GetSummonExpireTimer() const
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
bool HasPlayerFlag(PlayerFlags flags) const
std::unique_ptr< DuelInfo > duel
Item * GetItemByGuid(ObjectGuid guid) const
Vehicle * GetVehicle() const
virtual bool HasSpellCooldown(uint32) const
ShapeshiftForm GetShapeshiftForm() const
virtual bool HasSpellItemCooldown(uint32, uint32) const
bool IsInDisallowedMountForm() const
void CombatStart(Unit *target, bool initialAggro=true)
bool HasUnitFlag2(UnitFlags2 flags) const
bool IsInSanctuary() const
AuraEffect * IsScriptOverriden(SpellInfo const *spell, int32 script) const
float GetCombatReach() const override
UnitFlags GetUnitFlags() const
TempSummon * ToTempSummon()
bool HasStealthAura() const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
std::map< uint8, AuraApplication * > VisibleAuraMap
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
void SendTameFailure(uint8 result)
bool HasUnitMovementFlag(uint32 f) const
virtual bool IsInWater() const
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
ObjectGuid GetCharmGUID() const
VisibleAuraMap const * GetVisibleAuras()
ObjectGuid GetOwnerGUID() const
uint8 GetComboPoints(Unit const *who=nullptr) const
--------—Combo point system----------------—
ObjectGuid GetCharmerGUID() const
uint32 getTransForm() const
Powers getPowerType() const
void RemoveMovementImpairingAuras(bool withRoot)
Guardian * GetGuardianPet() const
ObjectGuid GetTarget() const
ObjectGuid GetPetGUID() const
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
bool IsBattlegroundOrArena() const
GameObject * GetGameObject(ObjectGuid const guid)
Difficulty GetDifficulty() const
uint32 GetRecruiterId() const
uint32 GetAccountId() const
GameObject * GetGOTarget() const
ObjectGuid GetItemTargetGUID() const
std::unique_ptr< PathGenerator > m_preGeneratedPath
SpellCastResult CheckSpellFocus()
SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType &skillid, int32 &reqSkillValue, int32 &skillValue)
SpellCastResult CheckItems()
int32 CalculateSpellDamage(uint8 i, Unit const *target) const
SpellCastResult CheckPower()
SpellCastResult CheckCasterAuras(bool preventionOnly) const
SpellCastResult CallScriptCheckCastHandlers()
SpellCastResult CheckRange(bool strict)
bool HasGlobalCooldown() const
SpellCastResult CheckShapeshift(uint32 form) const
uint32 GetDispelMask() const
uint32 GetRecoveryTime() const
bool CanBeUsedInCombat() const
uint32 CasterAuraStateNot
SpellSchoolMask GetSchoolMask() const
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
uint32 GetExplicitTargetMask() const
bool NeedsExplicitUnitTarget() const
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const *player=nullptr, bool strict=true) const
uint32 ExcludeCasterAuraSpell
uint32 AuraInterruptFlags
SpellCastResult CheckExplicitTarget(Unit const *caster, WorldObject const *target, Item const *itemTarget=nullptr) const